package util;

import com.octo.captcha.component.image.backgroundgenerator.BackgroundGenerator;
import com.octo.captcha.component.image.backgroundgenerator.FunkyBackgroundGenerator;
import com.octo.captcha.component.image.color.RandomRangeColorGenerator;
import com.octo.captcha.component.image.fontgenerator.FontGenerator;
import com.octo.captcha.component.image.fontgenerator.RandomFontGenerator;
import com.octo.captcha.component.image.textpaster.RandomTextPaster;
import com.octo.captcha.component.image.textpaster.TextPaster;
import com.octo.captcha.component.image.wordtoimage.ComposedWordToImage;
import com.octo.captcha.component.image.wordtoimage.WordToImage;
import com.octo.captcha.component.word.wordgenerator.RandomWordGenerator;
import com.octo.captcha.component.word.wordgenerator.WordGenerator;
import com.octo.captcha.engine.image.ListImageCaptchaEngine;
import com.octo.captcha.image.gimpy.GimpyFactory;
import com.octo.captcha.service.captchastore.FastHashMapCaptchaStore;
import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;
import com.octo.captcha.service.image.ImageCaptchaService;
import java.awt.Font;

public class CaptchaServiceSingleton {

    private static ImageCaptchaService instance;
    

    static {
        instance = new DefaultManageableImageCaptchaService(
                new FastHashMapCaptchaStore(),
                new MyImageCaptchaEngine(),
                180,
                100000,
                75000);
    }

    public static ImageCaptchaService getInstance() {

        //new com.octo.captcha.engine.image.gimpy.SimpleListImageCaptchaEngine();
        return instance;
    }
}

class MyImageCaptchaEngine extends ListImageCaptchaEngine {

    protected void buildInitialFactories() {
        WordGenerator wgen = new RandomWordGenerator("abcdefghijklmnopqrstuvwxy123456789");
        RandomRangeColorGenerator cgen = new RandomRangeColorGenerator(
                new int[]{0, 100},
                new int[]{0, 100},
                new int[]{0, 100});
        TextPaster textPaster = new RandomTextPaster(new Integer(4), new Integer(4), cgen, true);

        BackgroundGenerator backgroundGenerator = new FunkyBackgroundGenerator(new Integer(120), new Integer(50));

        Font[] fontsList = new Font[]{
            new Font("Verdana", 0, 10),
            new Font("Arial", 0, 10),
            new Font("Tahoma", 0, 10),            
        };

        FontGenerator fontGenerator = new RandomFontGenerator(new Integer(20), new Integer(35), fontsList);

        WordToImage wordToImage = new ComposedWordToImage(fontGenerator, backgroundGenerator, textPaster);
        this.addFactory(new GimpyFactory(wgen, wordToImage));
    }
}